local robot_obs = {}
local robot_id = 99900000       ---! 机器人起始编号
local robot_timer_id            ---! 机器人自动匹配定时器
local robot_match_timeout = 90  ---! 机器人自动匹配超时时间

---! 随机生成名字列表
local function _random_robot_names()
    local configs = IMPORT_D:query("robotname")
    if not configs then
        return
    end

    ---! 随机抽取八个名字
    return random_shuffle(configs, 8)
end

---! 生成机器人
local function _make_robot()
    ---! 优先获取缓存池里的机器人
    local user_ob = robot_obs[#robot_obs]
    if user_ob then
        robot_obs[#robot_obs] = nil
    else
        ---! ID自增长
        robot_id = robot_id + 1

        ---! 加载机器人
        local steam_id = "robot" .. robot_id
        user_ob = USER_D:load_user_by_steam_id(steam_id)
        user_ob:set_user_name(steam_id)

        ---! 设置基本信息
        user_ob:set_id(robot_id)

        ---! 转为机器人对象
        user_ob:become_robot()

        ---! 安排进入游戏
        USER_D:enter_world(user_ob)
    end

    ---! 返回机器人对象
    return user_ob
end

---! 生成机器人名字
local function _make_robot_name(room_ob, robot)
    local robot_names = room_ob:query_temp("robot_names")
    if not robot_names or #robot_names <= 0 then
        robot_names = room_ob:set_temp("robot_names", _random_robot_names())
    end

    local config = robot_names[#robot_names]
    robot_names[#robot_names] = nil
    robot:set_nick_name(config.robotname)
end

---! 检查匹配
local function _check_match()
    local match_queue = MATCH_D:get_match_queue()
    if not match_queue then
        return
    end

    local now_time = os.time()
    for _, room_ob in pairs(match_queue) do repeat
        local begin_time = room_ob:get_begin_time()
        if not begin_time then
            ---! 当前房间并未开始匹配
            break
        end

        if now_time - begin_time < robot_match_timeout then
            ---! 当前房间匹配尚未超时
            break
        end

        if room_ob:get_user_num(true) <= 0 then
            ---! 没有正在等待匹配的玩家
            break
        end

        ---! 生成一个机器人
        local robot = _make_robot()
        if robot then
            ---! 生成新的名字
            _make_robot_name(room_ob, robot)

            ---! 进入匹配队列
            MATCH_D:join_match(room_ob, { robot })
        end

    until true end
end

-------------------------------------------------------------------------------
---! 对外接口
-------------------------------------------------------------------------------

ROBOT_D = {}

---! 回收机器人
function ROBOT_D:recover_robot(robot_ob)
    if not robot_ob:is_robot() then
        return
    end

    if robot_ob:is_in_room() then
        return
    end

    if robot_ob:is_in_combat() then
        return
    end

    ---! 回收至缓存池
    table.insert(robot_obs, robot_ob)
end

function ROBOT_D:start_auto_match()
    if not robot_timer_id then
        robot_timer_id = TIMER_D:start_timer(2, _check_match)
    end
end

function ROBOT_D:stop_auto_match()
    if robot_timer_id then
        TIMER_D:cancel_timer(robot_timer_id)
        robot_timer_id = nil
    end
end

function ROBOT_D:get_all_robot_obs()
    return robot_obs
end

-------------------------------------------------------------------------------
---! 启动接口
-------------------------------------------------------------------------------
register_post_init(function()
    ---! 默认自动启动
    ROBOT_D:start_auto_match()
end)
